gtk: fix wheel scrolling for very small adjustment page_size
authorMichael Natterer <mitch@gimp.org>
Mon, 11 Jun 2018 16:36:50 +0000 (18:36 +0200)
committerMichael Natterer <mitch@gimp.org>
Tue, 12 Jun 2018 16:53:12 +0000 (18:53 +0200)
For very small page sizes of < 1.0, the effect of pow() is the
opposite of what's intended and the scroll steps become unusably
large, make sure we never get a scroll_unit larger than page_size /
2.0, which used to be the default before the pow() magic was
introduced.

gtk/gtkrange.c
gtk/gtkscrolledwindow.c

index dc495631cbc73731b42c8ef5c3cba11570904c5d..c1061029295b853b96e1fe9355713471d575fa71 100644 (file)
@@ -3061,7 +3061,17 @@ _gtk_range_get_wheel_delta (GtkRange       *range,
   page_increment = gtk_adjustment_get_page_increment (adjustment);
 
   if (GTK_IS_SCROLLBAR (range))
-    scroll_unit = pow (page_size, 2.0 / 3.0);
+    {
+      gdouble pow_unit = pow (page_size, 2.0 / 3.0);
+
+      /* for very small page sizes of < 1.0, the effect of pow() is
+       * the opposite of what's intended and the scroll steps become
+       * unusably large, make sure we never get a scroll_unit larger
+       * than page_size / 2.0, which used to be the default before the
+       * pow() magic was introduced.
+       */
+      scroll_unit = MIN (pow_unit, page_size / 2.0);
+    }
   else
     scroll_unit = page_increment;
 
index 8112cfd8e38ddf51e11cec8b2ac214764c9d6719..b390f9d42ef8634d99ca8ffe99d21beb1656bb6d 100644 (file)
@@ -1296,6 +1296,7 @@ get_scroll_unit (GtkScrolledWindow *sw,
   GtkRange *scrollbar;
   GtkAdjustment *adj;
   gdouble page_size;
+  gdouble pow_unit;
 
   if (orientation == GTK_ORIENTATION_HORIZONTAL)
     scrollbar = GTK_RANGE (priv->hscrollbar);
@@ -1307,7 +1308,10 @@ get_scroll_unit (GtkScrolledWindow *sw,
 
   adj = gtk_range_get_adjustment (scrollbar);
   page_size = gtk_adjustment_get_page_size (adj);
-  scroll_unit = pow (page_size, 2.0 / 3.0);
+
+  /* see comment in _gtk_range_get_wheel_delta() */
+  pow_unit = pow (page_size, 2.0 / 3.0);
+  scroll_unit = MIN (pow_unit, page_size / 2.0);
 #else
   scroll_unit = 1;
 #endif